#include <iostream>
#include "Poligono.h"
#include "ExcepcionSVG.h"
#include <sstream>

using namespace std;

Poligono::Poligono(vector<Coordenada> vert, int numVertice, int grosor, Color fondo, Color linea):Figura2D(Coordenada(0.0,0.0), grosor, fondo, linea)
{
	//~ numVertices = numVertice-1;
	/*vertices.push_back(getOrigen());*/
	//~ if (!vert.empty())
	//~ {
		//~ this->mover(vert[0]);
		//~ for(int i = 1; i < numVertices; i++)
		//~ {
			//~ vertices.push_back(vert[i]-getOrigen());
			//~ setVertice(i, vert[i]);
			//~ cout<<vertices[i]<<endl;
		//~ }
	//~ }
	vertices=vert;
	if (!vert.empty())
	{
		this->mover(vert[0]);
	}
	
	
	this->setGrosorLinea(grosor);
	this->setFondo(fondo);
	this->setLinea(linea);
	this->setGrosorLinea(grosor);
	this->setFondo(fondo);
	this->setLinea(linea);
}
	

Poligono::Poligono(const Poligono& nc):Figura2D(nc)
{
	if (vertices.size()>0)
	{
		vertices.clear();//comprobar que no esta vacio antes
	}
	
	vertices=nc.vertices;
}

Poligono::~Poligono()
{
	vertices.clear();
}

Poligono& 
Poligono::operator=(const Poligono& nc)
{
	if (this!=&nc)
	{
		Figura2D::operator=(nc);
		if (vertices.size()>0)
		{
			vertices.clear();//comprobar que no esta vacio antes;
		}
		vertices=nc.vertices;
	}
	return *this;
}

void 
Poligono::setVertice(int c, const Coordenada& co)
{
	
	if(c > getNumVertices() || c == 0) throw ExcepcionValorNoValido(c, "indice del poligono");
	else
	{
		vertices[c] = (co - getOrigen());
	}
}

void 
Poligono::leeEntrada(istream& is)
{
	Figura2D::leeEntrada(is);
	
	is>>numVertices;
	numVertices--;
	int i=0;
	float cx,cy;
	vertices.push_back(getOrigen());
	while(i<numVertices)
	{
		is>>cx>>cy;
		vertices.push_back(Coordenada(cx,cy));
		i++;
	}
	
}

Poligono*
Poligono::clonar() const
{
	return new Poligono(*this);
}

void
Poligono::escalar( float escala)
{
	int i=0;
	float a,b;
	try
	{
      if(escala>0)
      {
		 while(i<vertices.size())
		 {
			a=(vertices[i].getX()*escala)/100.0;
			b=(vertices[i].getY()*escala)/100.0;
			Coordenada aux(a,b);
			vertices[i]=aux;
			i++;
		 }
      }
      else
      {
         throw(ExcepcionValorNoValido(escala, "escala no valida"));
      }
   }
   catch(ExcepcionValorNoValido& ex)
   {
      cerr<<ex.what();
      throw;
   }
}

vector<Coordenada> 
Poligono::getPerimetro()const
{
	Coordenada aux = getOrigen()-vertices[0];
	for (int i = 0; i < vertices.size(); i++)
	{
		vertices[i]+aux;
	}
	
	return vertices;
}
void 
Poligono::pintar(ostream& os) const
{
	char comilla='"';
	
	Coordenada aux = getOrigen()-vertices[0];
	os<<"<polygon points=\"";
	for (int i = 0; i < vertices.size(); i++)
	{
		os<<vertices[i]+aux<<" ";
	}
	os<<comilla<<" ";
	Figura2D::pintar(os);
	os<<" />";
}

Poligono*
Poligono::duplicar(const Coordenada& nc)
{
	Poligono* p=this->clonar();
	p->agrupada=false;
	p->mover(nc);
	return p;
}

ostream& operator<<(ostream& os ,const Poligono& c)
{
	c.pintar(os);
	return os;
}


